ジョブの実行時に利用するSnowflakeのロールが指定できるようになりました #データ統合基盤 #CSアナリティクス
こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。
弊社プロダクトのデータ分析基盤「カスタマーストーリー アナリティクス」(Customer Story Analytics:CSA)のサービスである「CSA Job Management Console」(CSA JMC)では、Snowflakeに対して「テーブルの作成」や「ジョブ」による「データ連携」および「SQL」を実行することが可能です。
この「テーブルの作成」や「ジョブ」による「データ連携」および「SQL」を実行する際に、Snowflakeへの接続に利用する「ロール」を明示的に指定できるようになりました。
これにより、Snowflakeへの接続ユーザが利用できる「ロール」であれば、任意の「ロール」に切り替えてクエリを実行することが可能となります。イメージとしては、以下のようなイメージとなります。
例えば、特定の「ロール」でないとアクセスできないデータベースやテーブルに対して、接続設定の「ロール」に限定せずに任意の「ロール」に切り替えてクエリを実行することができます。
当エントリでは、実際に特定の「ロール」でのみ実行できるSQLクエリを実行するジョブを作成して試してみたいと思います。
CSA JMCの挙動確認バージョン
当エントリの内容は以下のCSA JMCバージョンで挙動を確認しています。
- CSA JMC v5.3.0
SQLクエリの準備
まずは、JMCで実行するSQLクエリを準備します。
今回は以下のようにROLE_DEMO
データベースのREGION
テーブルをSELECTするだけのクエリとします。このROLE_DEMO
データベース、および、REGION
テーブルはSYSADMIN
ロールがオーナーとなっており、他のロールには権限を付与していません。
従って、今回JMCで設定している接続情報のロールDEVELOPER
ではアクセスできないテーブルとなっています。
SELECT R_NAME FROM ROLE_DEMO.PUBLIC.REGION;
実際に、それぞれのロールでクエリをsnowsqlで実行して確認します。
foo_bar#XSMALL_WH@(no database).(no schema)>USE ROLE DEVELOPER; ╒══════════════════════════════════╕ │ status │ ╞══════════════════════════════════╡ │ Statement executed successfully. │ ╘══════════════════════════════════╛ 1 Row(s) produced. Time Elapsed: 0.140s foo_bar#XSMALL_WH@(no database).(no schema)>USE WAREHOUSE XSMALL_WH; ╒══════════════════════════════════╕ │ status │ ╞══════════════════════════════════╡ │ Statement executed successfully. │ ╘══════════════════════════════════╛ 1 Row(s) produced. Time Elapsed: 0.101s foo_bar#XSMALL_WH@(no database).(no schema)>SELECT R_NAME FROM ROLE_DEMO.PUBLIC.REGION; 002003 (02000): SQL compilation error: Database 'ROLE_DEMO' does not exist or not authorized.
権限が無いので、Database 'ROLE_DEMO' does not exist or not authorized.
というエラーになりました。
foo_bar#XSMALL_WH@(no database).(no schema)>USE ROLE SYSADMIN; ╒══════════════════════════════════╕ │ status │ ╞══════════════════════════════════╡ │ Statement executed successfully. │ ╘══════════════════════════════════╛ 1 Row(s) produced. Time Elapsed: 0.129s foo_bar#XSMALL_WH@(no database).(no schema)>USE WAREHOUSE XSMALL_WH; ╒══════════════════════════════════╕ │ status │ ╞══════════════════════════════════╡ │ Statement executed successfully. │ ╘══════════════════════════════════╛ 1 Row(s) produced. Time Elapsed: 0.136s foo_bar#XSMALL_WH@(no database).(no schema)>SELECT R_NAME FROM ROLE_DEMO.PUBLIC.REGION; ╒═════════════╕ │ R_NAME │ ╞═════════════╡ │ AFRICA │ ├─────────────┤ │ AMERICA │ ├─────────────┤ │ ASIA │ ├─────────────┤ │ EUROPE │ ├─────────────┤ │ MIDDLE EAST │ ╘═════════════╛ 5 Row(s) produced. Time Elapsed: 0.160s
こちらは問題なくSELECTできていますね。このSQLクエリをcan_select_with_sysadmin_role.sql
として保存し、JMCに登録しておきます。
ジョブでロールを指定して実行する
次に、ロールにSYSADMIN
を指定した「ジョブ」を作成し、実際にジョブを実行してみます。
「ジョブ」での具体的なロール指定の箇所はこちらです。
初期画面では接続設定で指定しているロールが設定されているので、ここをプルダウンからSYSADMIN
へ変更します。
あとは通常通り、「構成要素」として「SQL」のcan_select_with_sysadmin_role.sql
を指定して保存します。
保存したらジョブを実行して、成功しているのを確認します。
無事成功していたので、今度はSnowflake側のクエリ履歴画面から該当クエリIDを特定します。
クエリIDが特定できたら、以下のクエリで本当にSYSADMIN
ロールクエリが実行されたか確認してみます。
USE ROLE ACCOUNTADMIN; USE DATABASE SNOWFLAKE; USE SCHEMA ACCOUNT_USAGE; SELECT QUERY_TEXT, ROLE_NAME, WAREHOUSE_NAME FROM QUERY_HISTORY WHERE QUERY_ID = '0198f1a8-00a4-25c2-0000-0949001a823a' ;
╒═════════════════════════════════════════════╤═══════════╤════════════════╕ │ QUERY_TEXT │ ROLE_NAME │ WAREHOUSE_NAME │ ╞═════════════════════════════════════════════╪═══════════╪════════════════╡ │ SELECT R_NAME FROM ROLE_DEMO.PUBLIC.REGION; │ SYSADMIN │ XSMALL_WH │ ╘═════════════════════════════════════════════╧═══════════╧════════════════╛ 1 Row(s) produced. Time Elapsed: 0.870s
想定どおり、ロールはSYSADMIN
でクエリが実行されていました!
まとめ
以上、CSA JMCのv5.3.0におけるロールの指定についてのご紹介でした。ジョブ単位でロールが指定できるようになりましたので、指定のロールでジョブを実行したい場合などにご利用いただければと思います。
どなたかのお役に立てば幸いです。それでは!